Die zusätzlichen befehle das HD64180 Helmut Bernhardt Wer in seinem Cmoputer den Z80 durch einen HD64180 ersetzt hat, wird sicher schon ein plötzliches Booten oder einen Absturz bei Aufruf von bestimmten Programmen bemerkt haben, die vorher mit dem Z80 einwand- frei zusamnmengearbeitet haben. Zu solchen Programmen zählen REZILOG unter CP/M oder ZEUS unter NEWDOS/80. Der Fehler liegt nicht am Pro- zessor sondern am Programm. Der Programmierer hat dort Befehle benutzt, die von Zilog nicht dokumentiert sind aber trotzdem auf dem Z80 zur Verfügung stehen. Es sind die die Illegals mit Doppelbyte-Op- -codes. Hitachi hat nun andere Vorstellungen entwickelt, wie diese freien Op- codes verwendet werden können, und eine Reihe dieser Codes den in An- hang zusammengestellten Befehlen zugeordnet. Gegenüber den Illegals des Z80 sind das sinnvolle Ergänzungen, die der Architektur des HD64180 entgegenkommen und u.a. eine elegante Programmierung der in- ternen Ports der CPU ermöglichen. Die ebenfalls hinzugekommene Multi- plikation ist leider nur auf 8Bit-Faktoren beschränt geblieben. Der wichtigste Befehl ist OTIMR, der eine Anzahl von Bytes, die in B vorgegeben wird, ab einer Adresse im Speicher, auf die HL zeigt, an aufeinander folgende interne Zeropake-Ports ausgibt, wobei die Adres- se des ersten Ports in C vortugeben ist. Damit kann z.B. der DMA-Con- troller schnell mit Parmetern für eine Übertragung versorgt werden. In mc 1/87, S.74 wurde gezeigt, wie die Illegals durch nrmale Befehle ersetzt werden können. Danach kann man von Hand entprechende Prgram- me auf normale Befehle umstellen. Was der Normalverbraucher zu Fuß macht, läßt der Experte die CPU zur Laufzeit des Illegal-verseuchten Programms selbst machen. Eventuell schreibt Gerald dazu nochmal was. Bei Erreichen eines unbekannten Opcodes wird der höchstpriorisierte TRAP-Interrupt ausgeführt, der einen CALL 0000H gleichkommt. Er ist mit einem RESET vergleichbar, nur dass kein richtiges /RESET-Signal er- folgt, das die gesamte Hardware zurücksetzt. Dadurch wird auch kein Floppy-Controller in den Einschaltzustand zurückgesetzt und auch kein ausgeblendetes EPROM wieder eingeschaltet. Bei 0000H liegt dann ROM vor. Dort kann bei der Initialisierung ein Sprung auf die TRAP-Service-Routine gepatcht werden. Diese Routine kann mit dem Stack und den Flags im TRAP-Register herausfinden, ob ein TRAP die Ursache des Aufrufs war, oder ob die Adresse 0000H durch Software aufgerufen wurde; bei einem Trap kann sie ermitteln, welches Byte im Programm den TRAP auslöste und dem entprechend alternative normale Befehle abarbeiten, und anschließend wieder die Kontrolle an das unterbrochene Programm zurückgeben. Wenn eine solche TRAP-Service-Routine nicht vorliegt, bedeutet der CALL 0000H einen Warmstart unter CP/M oder einen Absturz unter NEWDOS/80, weil die BOOT-Routine im ROM nicht den Floppy-Controller auf Sinle Density zurücksetzt (deshalb funktioniert beim GENIE auch der Befehl BOOT oder ein JP 0000H nicht, wenn mit einem Doubler gearbeitet wird; der TRS 80 decodiert die Adresse 0000H und erzeugt darus ein /RESET-Signal). Natürlich funktioniert der TRAP-Interrupt nur bei den Z80-Illegls, für die der HD64180 keine neuen Befehle eingeführt hat. Wenn ein illegaler Opcode auftaucht, der einem HD64180-Befehl entpricht, so wird dieser Befehl nach Hitachi's Vorstellung ordnungsgemäß ausge- führt. Der Erfolg ist dann aber nicht der, den sich der Illegal- -Programmierer einst gedacht hat. Zusätzliche Befehle des HD64180 Multiplikation ED 4C MULT BC ;BC := B * C | 17 Taktzyklen ED 5C MULT DE ;DE ;= D * E | ED 6C MULT HL ;HL := H * L | ED 7C MULT SP ;SP := SPhigh * SPlow | Logisches AND zum Setzen der Flags, ohne die Register zu verändern ED 04 TEST B ; A and B | 7 TaktzyXlen ED 0C TEST C ; A and C | ED 14 TEST D ; A and D | ED 1C TEST E ; A and E | ED 24 TEST H ; A and H | ED 2C TEST L ; A and L | ED 3C TEST n ; A and A | ED 34 TE5T (HL) ; A and (HL) | 10 Takt2yklen ED 64 nn TEST nn ; A and nn | 9 Taktzyklen ED 74 pp TESTIO pp ; (C) and pp | 12 Taktzyklen Zeropage I/O-Befehle ED 00 pp IN0 B, {pp) ; B := (pp) | 12 Taktzyklen ED 08 pp IN0 C, (pp) ; C := (pp) | ED 10 pp IN0 D, (pp) ; D := (pp) | ED 18 pp IN0 E, (pp) ; E := (pp) | ED 20 pp IN0 H, (pp) ; H := (pp) | ED 28 pp IN0 L, (pp) ; L := (pp) | ED 30 pp IN0 F, (pp) ; S,Z,P <- (pp) | ED 38 pp IN0 A, (pp) ; A := (pp) | ED 01 pp OUT0 (pp),B ; (pp) := B | 13 TaXt2yklen ED 09 pp OUT0 (pp),C ; (pp) := C | ED 11 pp OUT0 (pp),D ; (pp) := D | ED 19 pp OUT0 (pp),E ; (pp) := E | ED 21 pp OUT0 (pp),H ; (pp) := H | ED 29 pp OUT0 (pp),L ; (pp) := L | ED 39 pp OUT0 (pp),A ; (pp} := A | ED 83 OTIM ; (C) := (HL), HL:= HL+1, C := C+1, B := B-1 14 Taktzyklen ED 93 OTIMR ; (C)..(C+B) := (HL)..(HL+B), B:=0 ; oder: (C):=(HL), C:=C+1, HL:=HL+1, B:BB-1 ; wiederhole bis B=0 B*16 Taktzyklen ED 8B OTDM ; (C):=(HL), HL:=HL-1, C;=C-1, B:=B-1 14 Taktzyklen ED 9B OTDMR ; (C)..(C-B) := (H).. (HL-B), B:=0 ; oder: (C):=(HL), C:=C-1, HL:=HL-1, B:=B-1 B*16 Taktzyklen ED 76 SLP ; Sleep: Einstellen aller Aktivitäten incl. ; Refresh, bis /RESET oder /IMT eintritt